package com.swanclouds.api.exceptions;

/**
 * Maps the documented API status codes into a StatusCode Enumeration Type.
 *
 * @author Jeremy Unruh
 */
public enum StatusCode {
    // Client Status Codes
    /**
     * The request cannot be fulfilled due to bad syntax.
     */
    BAD_REQUEST(400),
    /**
     * Similar to 403 Forbidden, but specifically for use when authentication is required and has failed or has not yet been provided
     */
    UNAUTHORIZED(401),
    /**
     * Reserved for future use.
     */
    PAYMENT_REQUIRED(402),
    /**
     * The request was a valid request, but the server is refusing to respond to it.
     */
    FORBIDDEN(403),
    /**
     * The requested resource could not be found but may be available again in the future
     */
    NOT_FOUND(404),
    /**
     * A request was made of a resource using a request method not supported by that resource
     */
    METHOD_NOT_ALLOWED(405),
    /**
     * The requested resource is only capable of generating content not acceptable according to the Accept headers sent in the request.
     */
    NOT_ACCEPTABLE(406),
    /**
     * The client must first authenticate itself with the proxy.
     */
    PROXY_AUTH_REQUIRED(407),
    /**
     * The server timed out waiting for the request.
     */
    REQUEST_TIMEOUT(408),
    /**
     * Indicates that the request could not be processed because of conflict in the request, such as an edit conflict.
     */
    CONFLICT(409),
    /**
     * Indicates that the resource requested is no longer available and will not be available again
     */
    GONE(410),
    /**
     * The request did not specify the length of its content, which is required by the requested resource
     */
    LENGTH_REQUIRED(411),
    /**
     * The server does not meet one of the preconditions that the requester put on the request
     */
    PRE_CONDITION_FAILED(412),
    /**
     * The request is larger than the server is willing or able to process.
     */
    REQUEST_ENTITY_TOO_LARGE(413),
    /**
     * The URI provided was too long for the server to process.
     */
    REQUEST_URI_TOO_LONG(414),
    /**
     * The request entity has a media type which the server or resource does not support
     */
    UNSUPPORTED_MEDIATYPE(415),
    /**
     * The client has asked for a portion of the file, but the server cannot supply that portion
     */
    REQUESTED_RANGE_NOT_SATISFIABLE(416),
    /**
     * The server cannot meet the requirements of the Expect request-header field.
     */
    EXPECTATION_FAILED(417),
    /**
     * The request was well-formed but was unable to be followed due to semantic errors
     */
    UNPROCESSABLE_ENTITY(422),

    //Server Status Code
    /**
     * A generic error message, given when no more specific message is suitable.
     */
    INTERNAL_SERVER_ERROR(500),
    /**
     * The server either does not recognize the request method, or it lacks the ability to fulfill the request
     */
    NOT_IMPLEMENTED(501),
    /**
     * The server was acting as a gateway or proxy and received an invalid response from the upstream server
     */
    BAD_GATEWAY(502),
    /**
     * The server is currently unavailable
     */
    SERVICE_UNAVAILABLE(503),
    /**
     * The server was acting as a gateway or proxy and did not receive a timely response from the upstream server.
     */
    GATEWAY_TIMEOUT(504),
    /**
     * The server does not support the HTTP protocol version used in the request.
     */
    VERSION_NOT_SUPPORTED(505),
    /**
     * Indicates the code we received is not found within this Enum
     */
    CODE_UNKNOWN(0);
    private final int code;

    private StatusCode(int code) {
        this.code = code;
    }

    public static StatusCode fromCode(int code) {
        for (StatusCode sc : StatusCode.values()) {
            if (sc.getCode() == code)
                return sc;
        }
        return CODE_UNKNOWN;
    }

    public int getCode() {
        return code;
    }
}
